今天來到 DAY22 要來討論資料預處理和標準化,正好這兩件事情都有一些蠻重要的幾個觀念可以來聊聊,還有在金融資料上的一些實務東西做分享。
如果你想要參考資料或是我講的依據呢,你也可以留言給我我再來找一下,原則上金融資料在類神經網路上的應用,學術和實務有一點小差距,原因仍然在於實務上將模型應用需要考量太多限制,例如法規還有你如何應對各種突發狀況,例如實務上你的在模型中使用的資源與策略也會不斷改正,怎麼排優先順序呢?這比較是學術比較難做到的,就像是我在前面幾天談的一些 Tricks 。
資料預處理簡單來說,就是你蒐集來的資料再進入你的模型前需要做的各種調整或變換,你在網路上可以搜尋到很多基礎知識的文章,那一些比較進階的操作都是需要使用到非常大量的資料、或是實時需要在伺服器中做交互之類的,那個也不會在我討論的範圍,我們這邊很簡單來談的就是資料的擷取、轉換與輸入,最後我會談一點後處理,這比較少人在討論,因為不是每個資料都需要後處理。
資料擷取在時間序列上會遇到的比較常見的兩個問題,就是你的時間尺度與缺失的資料,舉例來說,你現在手上有一份財務報表的資料,但問題是財務報表可能是每幾個月才會公司公布一次,他總不可能每天都在公布財務報表,所以你財務報表中的資料時間尺度是比較大的,我一般都是戲稱這是很大顆的資料,意思指在時間尺度上他跨度長、資訊單一。
因此,你每幾個月的財務報表中的數字,若要和一些尺度較小的資料作互動,或是聯合放入類神經網路模型中,你會遇到的第一個問題就是我怎麼再把這個財務報表中的數字時間尺度變小,或是我怎麼把尺度小的資料拉到財務報表這種較大尺度來對齊並分析。
這就要看你要解決的問題,我的習慣是比較傾向於往更小尺度去做,因此財務報表的資料我現在有三種處理法,我可以用類似高中學的插值法,或是我如果能理解財務報表分析的知識,我可能能知道其中各個數字是否有週期性或是比較趨近於一個不變常數等,我們就也可以直接做假設,去把小尺度的資料擠出來,放到模型中進行訓練,最後一種是看情況我也會用的,也就是貝氏的方法搭建資料庫,這個比較複雜,簡單來說每一筆資料我都給他一個信任機率,因此我在使用他的時候我對應會有一組我是否該信任這筆資料的機率值,這可以幫助我去留意資料是否值得信賴。
一般來說,我的習慣是都會保持紀錄三、四階動差的資訊,也就說如果我插值出來,我會希望我的三四階動差不會值差太大,這也倚賴你插值的資料與你最終最小的時間尺度,每個人處理的問題各有不同。
此外,一定要特別注意的事情是你的資料預處理動作能不能自動化,這是很重要的關鍵,因為通常我們模型訓練和實際上線去使用他,會在不同的機器上執行,如果你今天在你的電腦中用 python 去做,結果你最後是要到一台電腦上用 EXCEL 去執行你的模型,那你是不是也要在 EXCEL 中對於輸入資料做預處理?甚至說你是要在遠端去遙控,或是你是要佈署到許多你可能沒有權限的一些應用服務中作為一個重要核心運算。
資料轉換我覺得對於時間序列或是金融資料來說,最關鍵就是你怎麼去把噪音做一個處理,也就是你的資料中看起來好像沒什麼意義的微小改變,這邊要特別留意的事情是,如果你把資料過度的去噪,你在類神經網路中可能會訓練不出什麼東西,這體現在你加入更多神經元個數或模型複雜度的時候,你的誤差值下不去或目標值卡住,訓練不起來。
最常見的去噪方法就是用類似移動平均的方法,這類去噪方法常見的問題就是會滯後,也就是你的去噪後的資料看起來會比你原本的資料感覺延遲了一小段時間,如果你的標籤值沒有同步也去做對應的轉換,例如很多朋友常常會把他的輸入資料去做平滑,取移動平均,結果他的標籤值是對輸入資料的下一時點做預測,結果你每一時點的標籤值都沒有被平滑,但是你的輸入資料卻被平滑還滯後,缺點就是訓練不起來。
那我應該對標籤值做平滑嗎?這又感覺怪怪的,沒錯,恭喜你來到實務界,這就是你要去思考的問題。我的經驗是如果你的模型連過擬合都辦不到,那可以考慮放平滑後的標籤值,但如果你的模型可以透過提高模型複雜度就能匹配沒有平滑的標籤值,那就還是先不要對輸出做平滑吧!你可以把輸入做平滑之後,和原始輸入一起放入模型中當作訓練資料,這也是一種常見的方式。
如果你比較進階,你有時間序列的基本知識,我的建議就更簡單明瞭了,如果你大概看一下或跑一下模型,就發現一般 ARIMA 或是 GARCH 甚至傅立葉、小波分析就都能非常精準的處理的資料,拜託,就千萬別再用類神經網路折磨自己了,你一定要仔細想類神經網路和傳統時間序列分析理論的差別(例如極端值的處理、非線性、異質性等)
我覺得對於金融資料或是金融相關的類神經網路模型,最大麻煩的東西大概就是你需要對你的模型訓練輸出去做一些後處理,而且這些後處理都是需要「連貫性的處理」你沒辦法個別對於輸出去做後處理,可能是要整個模型針對一整個訓練樣本的輸出值,去做整批的後處理。
最簡單的處理就是把你的預測,例如你對風險或報酬的各種預測,轉換成連貫的一個分析策略訊號或是損益模擬,或者是說你可能只是簡單的需要把你標準化之後的資料轉換回來才能做下一步,這也是一種後處理,例如你預測台灣金融市場的風險,是為了讓你最終能做一個更抽象的決策,例如最終要推算全球風險等,那就得你至少得先算出來才能進行下一步。
關於標轉化我留到明天好了,標準化有了個關鍵,一個是你在做批優化的時候可以批標準化,另一個是你標準化除了到 0 到 1 或 -1 到 1 之外,你還可以試著讓總和為 1 這些討論將會明天再來繼續。今天的長篇大亂抬槓就告此一段落啦,明天見,希望對有興趣的人能有一點啟發或共鳴。